/**
 * EventServer 的简易哈希表结构
 */
#pragma once

#include "EventObject.h"

/* 哈希表存储模式 */
typedef enum
{
	/* 数字为键 */
	EVENT_HASH_MODEL_NUMBER = 0,
	/* 字符串(const char*)为键 */
	EVENT_HASH_MODEL_CHARSET = 1,
	/* 字符串对象(EventString)为键 */
	EVENT_HASH_MODEL_STRING = 2,
} EventHashModel;

/* 哈希表存储对象 */
typedef struct _EventHash EventHash;
#define EVENT_HASH(any) ((EventHash *)any)

/* 哈希槽结构 */
typedef struct _HashItem *HashItem_p;

/**
 * 创建一个哈希表对象
 * @param model 哈希表键值对模式，可传入数字或者字符串对象
 *
 * @return 返回一个空的哈希表对象
 */
extern EventHash *event_hash_new(EventHashModel model);

/**
 * @brief 向哈希表添加一条数据（若已存在则替代）
 *
 * 注意！若哈希表的键类型为 STRING，则哈希表将代管该 STRING 对象，
 * 为其引用计数增加 1。在删除对象时也将对 STRING 键减引用计数。
 *
 * 已修复潜在提前析构 bug
 *
 * @param key     键
 * @param value   任意数值
 * @param destory 任意数值的销毁钩子
 */
extern void event_hash_set(EventHash *self, epointer key, epointer value,
			   void (*destory)(epointer));

/**
 * 从哈希表取得一条数据
 * @param key 键
 * @return 返回键对应的任意数值
 */
extern epointer event_hash_get(EventHash *self, epointer key);

/**
 * 移除一条数据
 * @param key 要删除的键
 */
extern void event_hash_remove(EventHash *self, epointer key);

/**
 * @brief 验证某个键是否存在
 * @param key 要验证是否存在的键
 * @return bool: 是否存在
 */
extern bool event_hash_verify_exist(EventHash *self, epointer key);

/**
 * 设置哈希倍增值，该值最小为 6
 * @param multi_size 哈希倍增值
 */
extern void event_hash_set_multi_size(EventHash *self, euint32 multi_size);

/**
 * 打印哈希表当前状态
 */
extern void event_hash_print_status(EventHash *self);

/**
 * 哈希表迭代重设
 */
extern void event_hash_iter_reset(EventHash *self);

/**
 * 哈希表迭代方法
 * @return 返回迭代的下一个对象
 */
extern HashItem_p event_hash_iter_get(EventHash *self);

/**
 * 哈希表键值对数据的获取
 */
extern epointer event_hash_item_get_key(HashItem_p item);
extern epointer event_hash_item_get_value(HashItem_p item);
extern void	(*event_hash_item_get_destory(HashItem_p item))(epointer);

/**
 * 哈希表获取键值对个数
 */
extern euint32 event_hash_get_used_size(EventHash *self);
